package game 
{
	import fl.text.*;
	import flash.display.*;
	import flash.utils.*;
	import game.birds.*;
	/**
	 * ...
	 * @author Alexey Goretskiy
	 */
	public class Utils 
	{
		
		public function Utils() 
		{
			
		}
		
		public static function countDictionaryKeys( dict:Dictionary ):int 
		{
			var n:int = 0;
			
			for ( var key:* in dict )
			{
				n++;
			}
				
			return n;
		}
		
		public static function countKeys( dict:Dictionary ):int 
		{
			var n:int = 0;
			
			for ( var key:* in dict )
			{
				n++;
			}
				
			return n;
		}
		
		public static function randNumber(_min:int, _max:int):int
		{
			return Math.ceil(Math.random() * (_max - _min + 1)) + _min - 1;
		}
		
		/** Получение объекта по имени класса */
		public static function getClassObj( class_name:* ):*
		{
			var my_class:Class = getDefinitionByName( class_name ) as Class;
			return new my_class();
		}
		
		public static function getChildByNameDeep( o:DisplayObjectContainer, oname:String, ignoreIndependency:Boolean = false ):DisplayObject 
		{
			
			if( o == null ) return null;
			
			var c:DisplayObject = o.getChildByName( oname ) as DisplayObject;

			if( c != null ){
				return c;
			}
			
			for( var i:int = 0; i < o.numChildren; i++ ){
				
				var dob:DisplayObject = o.getChildAt( i );
				if( dob is DisplayObjectContainer && !( dob is TLFTextField ))
				{
					if( !ignoreIndependency )
					{
						if( dob.hasOwnProperty( "IndependedDisplay" ) && dob["IndependedDisplay"] == true )
						{
							continue;
						}
					}
					c = getChildByNameDeep( dob as DisplayObjectContainer, oname, ignoreIndependency );
					
					if( c != null ){
						return c;
					}
				}
			}
			return null;
		}
		
		/**
		 * Plays deeeeeeeeeeeeeeep
		 * allowRewind - разрешает перематывать с кадра на самого себя (вызывает повторный вызов скрипта во фрейме)
		 * unsafe - распространяется игнорируя IndependedDisplay
		 **/
		public static function PlayDeep( mclip: MovieClip, frameName:String, allowRewind:Boolean = true, unsafe:Boolean = false ):Boolean
		{
			/*if (mclip as TLFTextField) {				
				return false;;
			}*/
			if( frameName == null ) return false;
			if( mclip == null ) return false;

			var res:Boolean = gotoAndPlayIfExist( mclip, frameName, allowRewind );
			res = gotoAndPlayIfExist_Childs( mclip, frameName, allowRewind, unsafe ) || res;
			return res;
		}

		/** 
		 * Перематывает на указанную метку, если стоит не на этой метке или если разрешена перемотка (станет на тоже место)
		 * @parameter mc - Только MovieClip воспринимается
		 **/
		public static function gotoAndPlayIfExist( m:MovieClip, frame:String, allowRewind:Boolean = true ):Boolean
		{
			if( m == null  || frame == null ) return false;
	
			for( var j:int = 0; j < m.currentLabels.length; j++)
			{
				if( m.currentLabels[j].name == frame )
				{
					if( allowRewind || m.currentLabel != frame )
					{ 
						//m["previous_frame"] = m.currentFrame;
						m.gotoAndPlay( frame );
					}
					return true;
				}
			}
			return false;
		}
		
		// TODO: ваще-то MovieClip  крайне тупой тип для передачи. надо хотя бы спрайт. или того выше смотреть...
		// recursive
		// if want stop on soe object define public var IndependedDisplay:Boolean = true;
		public static function gotoAndPlayIfExist_Childs(mclip: DisplayObjectContainer, frameName:String, allowRewind:Boolean = true, unsafe:Boolean = false ):Boolean
		{
			if( mclip == null || frameName == null ) return false;

			var res:Boolean = false;

			for( var i:int = 0; i < mclip.numChildren; i ++ )
			{
				var dob:DisplayObject = mclip.getChildAt( i );

				// such a ??? happens
				if( dob == null ) continue;
				
				// if it is independed - don't go there
				if( ( dob.hasOwnProperty( "IndependedDisplay" ) && !unsafe )  && dob["IndependedDisplay"] == true )
				{
					continue;
				}

				if( dob is MovieClip )
				{
					res = PlayDeep( dob as MovieClip, frameName, allowRewind, unsafe ) || res;
				}
			}
			return res;
		}
		
	}

}